import pandas as pd
import numpy as np
from numpy.random import randn
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import plotly.express as px
import plotly.io as pio
pio.renderers.default = "notebook"
import warnings
from sklearn.neighbors import KNeighborsRegressor, KNeighborsClassifier, LocalOutlierFactor
from sklearn.linear_model import LinearRegression, LogisticRegression, RidgeClassifier, SGDClassifier, PassiveAggressiveClassifier
from sklearn.tree import DecisionTreeClassifier, ExtraTreeClassifier
from sklearn.ensemble import IsolationForest, GradientBoostingClassifier, ExtraTreesClassifier, RandomForestClassifier, BaggingClassifier, AdaBoostClassifier
from xgboost import XGBClassifier
from sklearn.svm import OneClassSVM, SVC
from sklearn.naive_bayes import GaussianNB
from sklearn.preprocessing import RobustScaler, LabelEncoder
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.compose import ColumnTransformer
from sklearn.feature_selection import SelectKBest
from sklearn.feature_extraction import DictVectorizer
from sklearn.decomposition import PCA
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV, KFold, StratifiedKFold, train_test_split, cross_val_score
from sklearn.metrics import precision_score, recall_score, make_scorer, classification_report, accuracy_score, confusion_matrix, log_loss
from keras.models import Sequential
from keras.layers import Dense, Dropout
# Increases the size of sns plots
sns.set(rc={'figure.figsize':(5,5)})
sns.set_style('darkgrid')
In this excersie we are going to compare different methods of predicting type of breast cancer (B/M). We are particularly interested in comparing standard linear and nonliner classification algorithms with simple Artificial Neural Network architecture.
Features are computed from a digitized image of a fine needle aspirate (FNA) of a breast mass. They describe characteristics of the cell nuclei present in the image.
Attribute Information:
3-32)
Ten real-valued features are computed for each cell nucleus:
Source: https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29
# Reading dataframe
df = pd.read_csv("wdbc.data.csv", header=None)
df.head()
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 842302 | M | 17.99 | 10.38 | 122.80 | 1001.0 | 0.11840 | 0.27760 | 0.3001 | 0.14710 | ... | 25.38 | 17.33 | 184.60 | 2019.0 | 0.1622 | 0.6656 | 0.7119 | 0.2654 | 0.4601 | 0.11890 |
| 1 | 842517 | M | 20.57 | 17.77 | 132.90 | 1326.0 | 0.08474 | 0.07864 | 0.0869 | 0.07017 | ... | 24.99 | 23.41 | 158.80 | 1956.0 | 0.1238 | 0.1866 | 0.2416 | 0.1860 | 0.2750 | 0.08902 |
| 2 | 84300903 | M | 19.69 | 21.25 | 130.00 | 1203.0 | 0.10960 | 0.15990 | 0.1974 | 0.12790 | ... | 23.57 | 25.53 | 152.50 | 1709.0 | 0.1444 | 0.4245 | 0.4504 | 0.2430 | 0.3613 | 0.08758 |
| 3 | 84348301 | M | 11.42 | 20.38 | 77.58 | 386.1 | 0.14250 | 0.28390 | 0.2414 | 0.10520 | ... | 14.91 | 26.50 | 98.87 | 567.7 | 0.2098 | 0.8663 | 0.6869 | 0.2575 | 0.6638 | 0.17300 |
| 4 | 84358402 | M | 20.29 | 14.34 | 135.10 | 1297.0 | 0.10030 | 0.13280 | 0.1980 | 0.10430 | ... | 22.54 | 16.67 | 152.20 | 1575.0 | 0.1374 | 0.2050 | 0.4000 | 0.1625 | 0.2364 | 0.07678 |
5 rows × 32 columns
#Inputs from output and splitting into training/test set
X = df.iloc[:, 2:].to_numpy()
y = df.iloc[:, 1].to_numpy()
y = LabelEncoder().fit_transform(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, shuffle=True, random_state=111, test_size=0.1)
# Check for missing values
import missingno as msno
from missingno import bar
msno.bar(df)
<AxesSubplot: >
Data is 100% complete.
# Distribution of variables
df2 = pd.DataFrame(X)
for i in df2.columns[2:5]:
fig = px.histogram(df2,
x=i,
marginal='box',
text_auto=True,
color_discrete_sequence = ['steelblue'],
template='simple_white')
fig.update_layout(xaxis_title=i, yaxis_title="Count", bargap=0.1)
fig.show()
Looking above at 3 random variables, we can see multiple outliers presence.
# Dependent variable weights
df[1].value_counts()
B 357 M 212 Name: 1, dtype: int64
In this section we are defining several functions for batch-evaluating different models.
from numpy import mean
from numpy import std
#dictionary of models to be evaluated
def define_models(models=dict()):
#linear models
models['logistic'] = LogisticRegression(max_iter=1000)
alpha = [0.1, 0.2, 0.3]
for a in alpha:
models['ridge-'+str(a)] = RidgeClassifier(alpha=a)
models['sgd'] = SGDClassifier(max_iter=1000, tol=1e-3)
models['pa'] = PassiveAggressiveClassifier(max_iter=1000, tol=1e-3)
#nonlinear models
n_neighbors = range(3, 10)
for k in n_neighbors:
models['knn-'+str(k)] = KNeighborsClassifier(n_neighbors=k)
models['cart'] = DecisionTreeClassifier()
models['extra'] = ExtraTreeClassifier()
models['svml'] = SVC(kernel='linear')
models['svmp'] = SVC(kernel='poly')
c_values = [0.1, 0.2, 0.3]
for c in c_values:
models['svmr'+str(c)] = SVC(C=c)
models['bayes'] = GaussianNB()
#ensemble models
n_trees = 100
models['ada'] = AdaBoostClassifier(n_estimators=n_trees)
models['bag'] = BaggingClassifier(n_estimators=n_trees)
models['rf'] = RandomForestClassifier(n_estimators=n_trees)
models['et'] = ExtraTreesClassifier(n_estimators=n_trees)
models['gbm'] = GradientBoostingClassifier(n_estimators=n_trees)
print('Defined %d models' % len(models))
return models
# additionally define and append gradient boosting models to the previously created list of models
def define_gbm_models(models=dict(), use_xgb=True):
#define grid space
rates = [0.001, 0.01, 0.1]
trees = [100, 500]
depth = [3, 7, 9]
#adding consecutive configurations
for l in rates:
for t in trees:
for d in depth:
cfg = [l, t, d]
if use_xgb:
name = 'xgb-' + str(cfg)
models[name] = XGBClassifier(learning_rate=l, n_estimators=t, max_depth=d)
else:
name = 'gbm-' + str(cfg)
models[name] = GradientBoostingClassifier(learning_rate=l, n_estimators=t, max_depth=d)
print('Defined %d models' % len(models))
return models
#evaluate a single model
def evaluate_model(X, y, model, folds, metric):
skf = StratifiedKFold(n_splits=folds, shuffle = True, random_state = 1001)
# create the pipeline
pipeline = make_pipeline(model)
#evaluate model
scores = cross_val_score(pipeline, X, y, scoring=metric, cv=skf, verbose=5)
return scores
#evaluate a single model and filter out errors
def hidden_evaluate_mode(X, y, model, folds, metric):
scores = None
try:
with warnings.catch_warnings():
warnings.filterwarnings("ignore")
scores = evaluate_model(X, y, model, folds, metric)
except:
scores = None
return scores
# evaluate a dict of models {name:object}, returns {name:score}
def evaluate_models(X, y, models, folds=3, metric='accuracy'):
results = dict()
for name, model in models.items():
# evaluate the model
scores = hidden_evaluate_mode(X, y, model, folds, metric)
# show process
if scores is not None:
# store a result
results[name] = scores
mean_score, std_score = mean(scores), std(scores)
print('>%s: %.3f (+/-%.3f)' % (name, mean_score, std_score))
else:
print('>%s: error' % name)
return results
#print and plot top results
def summarize_results(results, maximize=True, top_n=10):
#check for empty result
if len(results) == 0:
print('no results')
return
#determine how many results to summarize
n = min(top_n, len(results))
#create a list of (name, mean(scores)) tuples
mean_scores = [(k, mean(v)) for k,v in results.items()]
#sort tuples by mean score
mean_scores = sorted(mean_scores, key=lambda x: x[1])
#reverse for descending order (e.g. for accuracy)
if maximize:
mean_scores = list(reversed(mean_scores))
#retrieve the top n for summary
names = [x[0] for x in mean_scores[:n]]
scores = [results[x[0]] for x in mean_scores[:n]]
# print the top n
print()
for i in range(n):
name = names[i]
mean_score, std_score = mean(results[name]), std(results[name])
print('Rank=%d, Name=%s, Score=%.3f (+/- %.3f)' % (i+1, name, mean_score, std_score))
#boxplot for the top values
plt.boxplot(scores, labels=names)
_, labels = plt.xticks()
plt.setp(labels, rotation=90)
#get model list
models = define_models()
models = define_gbm_models(models)
Defined 26 models Defined 44 models
We are also defining pipeline to scale the variables with RobustScaler() due to presence of outliers and perform Principal Compoent Analysis to reduce feature space as we are dealing with variables based on physical properties of cells (radius, area), which might be higly correlated.
#DEFINING PIPELINE
def make_pipeline(model):
numeric_transformer = Pipeline(steps=[
# ('imputer', SimpleImputer(strategy='mean')),
('standard_scaler', RobustScaler()),
('pca', PCA())#n_components=0.9, svd_solver='full'))
])
preprocessor = ColumnTransformer(
transformers=[
('numeric', numeric_transformer, slice(2,32)),
# ('categorical', categorical_transformer, categorical_features)
])
pipeline = Pipeline(steps = [
('preprocessor', preprocessor),
('model', model)
])
return pipeline
# Call function once to show a sample pipeline
make_pipeline(model = models['logistic'])
Pipeline(steps=[('preprocessor',
ColumnTransformer(transformers=[('numeric',
Pipeline(steps=[('standard_scaler',
RobustScaler()),
('pca',
PCA())]),
slice(2, 32, None))])),
('model', LogisticRegression(max_iter=1000))])In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. Pipeline(steps=[('preprocessor',
ColumnTransformer(transformers=[('numeric',
Pipeline(steps=[('standard_scaler',
RobustScaler()),
('pca',
PCA())]),
slice(2, 32, None))])),
('model', LogisticRegression(max_iter=1000))])ColumnTransformer(transformers=[('numeric',
Pipeline(steps=[('standard_scaler',
RobustScaler()),
('pca', PCA())]),
slice(2, 32, None))])slice(2, 32, None)
RobustScaler()
PCA()
LogisticRegression(max_iter=1000)
Now we evaluate pre-prepared dictionary of models with 3-fold cross validation on the training set.
import time
# Start timer for assessing batch-testing of multiple models
start = time.time()
# call function for batch-evaluating dictionary of models of training split
results_2 = evaluate_models(X_train, y_train, models)
end = time.time()
print("Execution time: ",(end-start), "s")
Execution time: 120.1248710155487 s
#Results of batch-searching through multiple models
summarize_results(results_2, top_n=20)
Rank=1, Name=svml, Score=0.975 (+/- 0.003) Rank=2, Name=logistic, Score=0.973 (+/- 0.007) Rank=3, Name=pa, Score=0.969 (+/- 0.011) Rank=4, Name=sgd, Score=0.969 (+/- 0.003) Rank=5, Name=knn-9, Score=0.955 (+/- 0.023) Rank=6, Name=ridge-0.3, Score=0.949 (+/- 0.022) Rank=7, Name=ridge-0.2, Score=0.949 (+/- 0.022) Rank=8, Name=ridge-0.1, Score=0.949 (+/- 0.022) Rank=9, Name=knn-7, Score=0.949 (+/- 0.018) Rank=10, Name=xgb-[0.1, 500, 9], Score=0.947 (+/- 0.019) Rank=11, Name=xgb-[0.1, 500, 7], Score=0.947 (+/- 0.019) Rank=12, Name=knn-8, Score=0.947 (+/- 0.030) Rank=13, Name=knn-6, Score=0.947 (+/- 0.022) Rank=14, Name=svmr0.3, Score=0.945 (+/- 0.028) Rank=15, Name=knn-3, Score=0.945 (+/- 0.014) Rank=16, Name=xgb-[0.1, 500, 3], Score=0.943 (+/- 0.011) Rank=17, Name=knn-5, Score=0.943 (+/- 0.017) Rank=18, Name=xgb-[0.1, 100, 9], Score=0.941 (+/- 0.027) Rank=19, Name=xgb-[0.1, 100, 7], Score=0.941 (+/- 0.027) Rank=20, Name=xgb-[0.1, 100, 3], Score=0.941 (+/- 0.019)
# Define model and pipeline
model_svcl = SVC()
pipe_svcl = make_pipeline(model_svcl)
# Define search grid
grid = GridSearchCV(
estimator=pipe_svcl,
param_grid={'model__degree': [_ for _ in np.linspace(1, 5, 5)],
'model__kernel': [_ for _ in ['linear', 'poly', 'rbf']]},
scoring={'precision': make_scorer(precision_score),
'recall': make_scorer(recall_score),
'accuracy': make_scorer(accuracy_score)},
refit='accuracy',
return_train_score=False,
cv=10,
n_jobs=1
)
# Fit the model
grid.fit(X_train, y_train);
df_results = pd.DataFrame(grid.cv_results_)
df_1 = df_results[df_results['param_model__kernel'] == 'poly']
df_1
| mean_fit_time | std_fit_time | mean_score_time | std_score_time | param_model__degree | param_model__kernel | params | split0_test_precision | split1_test_precision | split2_test_precision | ... | split3_test_accuracy | split4_test_accuracy | split5_test_accuracy | split6_test_accuracy | split7_test_accuracy | split8_test_accuracy | split9_test_accuracy | mean_test_accuracy | std_test_accuracy | rank_test_accuracy | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 0.139108 | 0.058178 | 0.009301 | 0.001345 | 1.0 | poly | {'model__degree': 1.0, 'model__kernel': 'poly'} | 0.95 | 1.0 | 0.947368 | ... | 1.000000 | 0.960784 | 0.941176 | 0.980392 | 0.941176 | 1.000000 | 0.960784 | 0.970664 | 0.021890 | 6 |
| 4 | 0.100606 | 0.054840 | 0.012901 | 0.009985 | 2.0 | poly | {'model__degree': 2.0, 'model__kernel': 'poly'} | 1.00 | 1.0 | 1.000000 | ... | 0.843137 | 0.803922 | 0.784314 | 0.823529 | 0.784314 | 0.862745 | 0.764706 | 0.810558 | 0.028985 | 14 |
| 7 | 0.072704 | 0.036425 | 0.008700 | 0.001900 | 3.0 | poly | {'model__degree': 3.0, 'model__kernel': 'poly'} | 1.00 | 1.0 | 1.000000 | ... | 0.882353 | 0.882353 | 0.882353 | 0.980392 | 0.843137 | 0.921569 | 0.803922 | 0.882805 | 0.047106 | 12 |
| 10 | 0.173710 | 0.125013 | 0.011501 | 0.002500 | 4.0 | poly | {'model__degree': 4.0, 'model__kernel': 'poly'} | 1.00 | 1.0 | 1.000000 | ... | 0.764706 | 0.803922 | 0.784314 | 0.823529 | 0.745098 | 0.823529 | 0.725490 | 0.783220 | 0.033075 | 15 |
| 13 | 0.070704 | 0.027628 | 0.010901 | 0.002071 | 5.0 | poly | {'model__degree': 5.0, 'model__kernel': 'poly'} | 1.00 | 1.0 | 1.000000 | ... | 0.784314 | 0.823529 | 0.843137 | 0.882353 | 0.803922 | 0.843137 | 0.784314 | 0.822247 | 0.029699 | 13 |
5 rows × 46 columns
df_mean = df_results.groupby('param_model__kernel').agg('mean')
df_mean.mean_test_accuracy
param_model__kernel linear 0.968741 poly 0.853899 rbf 0.970701 Name: mean_test_accuracy, dtype: float64
# Plot grid-search results
plt.figure(figsize=(12, 4))
for kernel in df_results.param_model__kernel.unique():
plt.plot(df_results[df_results['param_model__kernel'] == kernel].param_model__degree,
df_results[df_results['param_model__kernel'] == kernel].mean_test_accuracy,
label = kernel)
plt.legend();
Both 1-degree polynomial model and rbf give similar values of accuracy. We choose Supported Vector Machine with rbf kernel as a final nonlinear model.
# Fitting final model and plotting confusion matrix
model_svc_final = SVC(kernel='rbf')
pipe_svc_final = make_pipeline(model_svcl)
pipe_svc_final.fit(X_train, y_train)
y_pred = pipe_svc_final.predict(X_test)
y_pred = (y_pred > 0.50)
cm = confusion_matrix(y_test, y_pred)
cat = ['Benign - 0', 'Malignant - 1']
sns.heatmap(cm, annot = True, xticklabels = cat, yticklabels = cat)
<AxesSubplot: >
In case of SVC model only 1 case is classified incorrectly on the test set.
This time simple architecture of neural network is defined using keras package.
from keras import backend as K
del model_deep
K.clear_session()
model_deep = Sequential(
[
Dense(units=32, activation='relu', kernel_initializer="uniform" ,input_shape=(30,)),
Dropout(rate=0.1),
Dense(units=32, activation='relu', kernel_initializer="uniform"),
Dropout(rate=0.1),
Dense(units=1, activation='sigmoid'),
]
)
model_deep.layers
model_deep.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model_deep.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 32) 992
dropout (Dropout) (None, 32) 0
dense_1 (Dense) (None, 32) 1056
dropout_1 (Dropout) (None, 32) 0
dense_2 (Dense) (None, 1) 33
=================================================================
Total params: 2,081
Trainable params: 2,081
Non-trainable params: 0
_________________________________________________________________
# Fitting the ANN model
start_n = time.time()
model_deep.fit(X_train, y_train, batch_size=100, epochs=400)
end_n = time.time()
Epoch 1/400 6/6 [==============================] - 2s 4ms/step - loss: 1.1306 - accuracy: 0.4453 Epoch 2/400 6/6 [==============================] - 0s 8ms/step - loss: 0.7455 - accuracy: 0.5898 Epoch 3/400 6/6 [==============================] - 0s 18ms/step - loss: 0.7273 - accuracy: 0.6543 Epoch 4/400 6/6 [==============================] - 0s 8ms/step - loss: 0.6203 - accuracy: 0.5566 Epoch 5/400 6/6 [==============================] - 0s 8ms/step - loss: 0.5975 - accuracy: 0.7617 Epoch 6/400 6/6 [==============================] - 0s 7ms/step - loss: 0.5526 - accuracy: 0.7832 Epoch 7/400 6/6 [==============================] - 0s 7ms/step - loss: 0.5231 - accuracy: 0.7695 Epoch 8/400 6/6 [==============================] - 0s 8ms/step - loss: 0.4916 - accuracy: 0.8086 Epoch 9/400 6/6 [==============================] - 0s 5ms/step - loss: 0.4288 - accuracy: 0.8613 Epoch 10/400 6/6 [==============================] - 0s 5ms/step - loss: 0.4108 - accuracy: 0.8457 Epoch 11/400 6/6 [==============================] - 0s 6ms/step - loss: 0.3662 - accuracy: 0.8691 Epoch 12/400 6/6 [==============================] - 0s 5ms/step - loss: 0.3462 - accuracy: 0.8730 Epoch 13/400 6/6 [==============================] - 0s 14ms/step - loss: 0.3140 - accuracy: 0.8887 Epoch 14/400 6/6 [==============================] - 0s 6ms/step - loss: 0.3429 - accuracy: 0.8672 Epoch 15/400 6/6 [==============================] - 0s 4ms/step - loss: 0.3033 - accuracy: 0.8848 Epoch 16/400 6/6 [==============================] - 0s 5ms/step - loss: 0.3027 - accuracy: 0.9023 Epoch 17/400 6/6 [==============================] - 0s 14ms/step - loss: 0.2762 - accuracy: 0.8926 Epoch 18/400 6/6 [==============================] - 0s 4ms/step - loss: 0.2912 - accuracy: 0.8906 Epoch 19/400 6/6 [==============================] - 0s 23ms/step - loss: 0.2574 - accuracy: 0.9023 Epoch 20/400 6/6 [==============================] - 0s 12ms/step - loss: 0.2685 - accuracy: 0.8984 Epoch 21/400 6/6 [==============================] - 0s 10ms/step - loss: 0.2660 - accuracy: 0.9082 Epoch 22/400 6/6 [==============================] - 0s 7ms/step - loss: 0.2847 - accuracy: 0.8906 Epoch 23/400 6/6 [==============================] - 0s 9ms/step - loss: 0.2709 - accuracy: 0.9004 Epoch 24/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2317 - accuracy: 0.9141 Epoch 25/400 6/6 [==============================] - 0s 12ms/step - loss: 0.2461 - accuracy: 0.9121 Epoch 26/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2330 - accuracy: 0.9121 Epoch 27/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2258 - accuracy: 0.9004 Epoch 28/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2262 - accuracy: 0.9082 Epoch 29/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2526 - accuracy: 0.9062 Epoch 30/400 6/6 [==============================] - 0s 4ms/step - loss: 0.3385 - accuracy: 0.8516 Epoch 31/400 6/6 [==============================] - 0s 4ms/step - loss: 0.2400 - accuracy: 0.9121 Epoch 32/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2268 - accuracy: 0.9160 Epoch 33/400 6/6 [==============================] - 0s 4ms/step - loss: 0.2360 - accuracy: 0.9121 Epoch 34/400 6/6 [==============================] - 0s 32ms/step - loss: 0.2282 - accuracy: 0.9062 Epoch 35/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2187 - accuracy: 0.9160 Epoch 36/400 6/6 [==============================] - 0s 13ms/step - loss: 0.2519 - accuracy: 0.8984 Epoch 37/400 6/6 [==============================] - 0s 12ms/step - loss: 0.2428 - accuracy: 0.9141 Epoch 38/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2601 - accuracy: 0.8926 Epoch 39/400 6/6 [==============================] - 0s 13ms/step - loss: 0.2295 - accuracy: 0.9160 Epoch 40/400 6/6 [==============================] - 0s 8ms/step - loss: 0.2151 - accuracy: 0.9258 Epoch 41/400 6/6 [==============================] - 0s 21ms/step - loss: 0.2250 - accuracy: 0.9102 Epoch 42/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2111 - accuracy: 0.9238 Epoch 43/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2118 - accuracy: 0.9141 Epoch 44/400 6/6 [==============================] - 0s 18ms/step - loss: 0.2246 - accuracy: 0.9062 Epoch 45/400 6/6 [==============================] - 0s 12ms/step - loss: 0.2251 - accuracy: 0.9160 Epoch 46/400 6/6 [==============================] - 0s 10ms/step - loss: 0.2192 - accuracy: 0.9160 Epoch 47/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2013 - accuracy: 0.9199 Epoch 48/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1973 - accuracy: 0.9160 Epoch 49/400 6/6 [==============================] - 0s 22ms/step - loss: 0.2100 - accuracy: 0.9121 Epoch 50/400 6/6 [==============================] - 0s 12ms/step - loss: 0.2270 - accuracy: 0.9141 Epoch 51/400 6/6 [==============================] - 0s 6ms/step - loss: 0.2090 - accuracy: 0.8984 Epoch 52/400 6/6 [==============================] - 0s 15ms/step - loss: 0.2069 - accuracy: 0.9160 Epoch 53/400 6/6 [==============================] - 0s 27ms/step - loss: 0.1930 - accuracy: 0.9277 Epoch 54/400 6/6 [==============================] - 0s 15ms/step - loss: 0.2043 - accuracy: 0.9141 Epoch 55/400 6/6 [==============================] - 0s 17ms/step - loss: 0.1902 - accuracy: 0.9219 Epoch 56/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1947 - accuracy: 0.9277 Epoch 57/400 6/6 [==============================] - 0s 10ms/step - loss: 0.1813 - accuracy: 0.9277 Epoch 58/400 6/6 [==============================] - 0s 12ms/step - loss: 0.1961 - accuracy: 0.9277 Epoch 59/400 6/6 [==============================] - 0s 4ms/step - loss: 0.2082 - accuracy: 0.9160 Epoch 60/400 6/6 [==============================] - 0s 11ms/step - loss: 0.1932 - accuracy: 0.9258 Epoch 61/400 6/6 [==============================] - 0s 23ms/step - loss: 0.1931 - accuracy: 0.9277 Epoch 62/400 6/6 [==============================] - 0s 11ms/step - loss: 0.2063 - accuracy: 0.9102 Epoch 63/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1933 - accuracy: 0.9238 Epoch 64/400 6/6 [==============================] - 0s 22ms/step - loss: 0.1855 - accuracy: 0.9199 Epoch 65/400 6/6 [==============================] - 0s 10ms/step - loss: 0.1824 - accuracy: 0.9238 Epoch 66/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2146 - accuracy: 0.9141 Epoch 67/400 6/6 [==============================] - 0s 14ms/step - loss: 0.1916 - accuracy: 0.9199 Epoch 68/400 6/6 [==============================] - 0s 14ms/step - loss: 0.2218 - accuracy: 0.9082 Epoch 69/400 6/6 [==============================] - 0s 9ms/step - loss: 0.2057 - accuracy: 0.9121 Epoch 70/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1907 - accuracy: 0.9199 Epoch 71/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2101 - accuracy: 0.9180 Epoch 72/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1795 - accuracy: 0.9258 Epoch 73/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1707 - accuracy: 0.9277 Epoch 74/400 6/6 [==============================] - 0s 12ms/step - loss: 0.1826 - accuracy: 0.9199 Epoch 75/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1818 - accuracy: 0.9238 Epoch 76/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1984 - accuracy: 0.9180 Epoch 77/400 6/6 [==============================] - 0s 10ms/step - loss: 0.1752 - accuracy: 0.9316 Epoch 78/400 6/6 [==============================] - 0s 12ms/step - loss: 0.2582 - accuracy: 0.8828 Epoch 79/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1774 - accuracy: 0.9375 Epoch 80/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1883 - accuracy: 0.9277 Epoch 81/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1922 - accuracy: 0.9219 Epoch 82/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1756 - accuracy: 0.9258 Epoch 83/400 6/6 [==============================] - 0s 19ms/step - loss: 0.1886 - accuracy: 0.9316 Epoch 84/400 6/6 [==============================] - 0s 14ms/step - loss: 0.1859 - accuracy: 0.9219 Epoch 85/400 6/6 [==============================] - 0s 12ms/step - loss: 0.1932 - accuracy: 0.9180 Epoch 86/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1797 - accuracy: 0.9297 Epoch 87/400 6/6 [==============================] - 0s 13ms/step - loss: 0.1760 - accuracy: 0.9336 Epoch 88/400 6/6 [==============================] - 0s 17ms/step - loss: 0.1737 - accuracy: 0.9219 Epoch 89/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1767 - accuracy: 0.9219 Epoch 90/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1898 - accuracy: 0.9297 Epoch 91/400 6/6 [==============================] - 0s 10ms/step - loss: 0.1787 - accuracy: 0.9180 Epoch 92/400 6/6 [==============================] - 0s 10ms/step - loss: 0.1751 - accuracy: 0.9355 Epoch 93/400 6/6 [==============================] - 0s 10ms/step - loss: 0.2574 - accuracy: 0.8926 Epoch 94/400 6/6 [==============================] - 0s 10ms/step - loss: 0.2440 - accuracy: 0.8965 Epoch 95/400 6/6 [==============================] - 0s 15ms/step - loss: 0.1920 - accuracy: 0.9238 Epoch 96/400 6/6 [==============================] - 0s 17ms/step - loss: 0.1944 - accuracy: 0.9238 Epoch 97/400 6/6 [==============================] - 0s 17ms/step - loss: 0.1938 - accuracy: 0.9141 Epoch 98/400 6/6 [==============================] - 0s 13ms/step - loss: 0.1760 - accuracy: 0.9336 Epoch 99/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1805 - accuracy: 0.9238 Epoch 100/400 6/6 [==============================] - 0s 4ms/step - loss: 0.1635 - accuracy: 0.9434 Epoch 101/400 6/6 [==============================] - 0s 4ms/step - loss: 0.1869 - accuracy: 0.9258 Epoch 102/400 6/6 [==============================] - 0s 10ms/step - loss: 0.1773 - accuracy: 0.9219 Epoch 103/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1692 - accuracy: 0.9355 Epoch 104/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1864 - accuracy: 0.9180 Epoch 105/400 6/6 [==============================] - 0s 16ms/step - loss: 0.1678 - accuracy: 0.9375 Epoch 106/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1813 - accuracy: 0.9180 Epoch 107/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1726 - accuracy: 0.9121 Epoch 108/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1705 - accuracy: 0.9355 Epoch 109/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1623 - accuracy: 0.9297 Epoch 110/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1904 - accuracy: 0.9258 Epoch 111/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1575 - accuracy: 0.9395 Epoch 112/400 6/6 [==============================] - 0s 31ms/step - loss: 0.2428 - accuracy: 0.8789 Epoch 113/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1967 - accuracy: 0.9238 Epoch 114/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1628 - accuracy: 0.9316 Epoch 115/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1617 - accuracy: 0.9316 Epoch 116/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1590 - accuracy: 0.9414 Epoch 117/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1574 - accuracy: 0.9355 Epoch 118/400 6/6 [==============================] - 0s 40ms/step - loss: 0.1504 - accuracy: 0.9316 Epoch 119/400 6/6 [==============================] - 0s 14ms/step - loss: 0.1648 - accuracy: 0.9395 Epoch 120/400 6/6 [==============================] - 0s 20ms/step - loss: 0.1853 - accuracy: 0.9160 Epoch 121/400 6/6 [==============================] - 0s 19ms/step - loss: 0.1690 - accuracy: 0.9375 Epoch 122/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1569 - accuracy: 0.9395 Epoch 123/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1621 - accuracy: 0.9336 Epoch 124/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1865 - accuracy: 0.9336 Epoch 125/400 6/6 [==============================] - 0s 33ms/step - loss: 0.1697 - accuracy: 0.9258 Epoch 126/400 6/6 [==============================] - 0s 16ms/step - loss: 0.1668 - accuracy: 0.9355 Epoch 127/400 6/6 [==============================] - 0s 16ms/step - loss: 0.1676 - accuracy: 0.9316 Epoch 128/400 6/6 [==============================] - 0s 4ms/step - loss: 0.1649 - accuracy: 0.9219 Epoch 129/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1490 - accuracy: 0.9375 Epoch 130/400 6/6 [==============================] - 0s 13ms/step - loss: 0.1578 - accuracy: 0.9277 Epoch 131/400 6/6 [==============================] - 0s 15ms/step - loss: 0.1525 - accuracy: 0.9414 Epoch 132/400 6/6 [==============================] - 0s 12ms/step - loss: 0.1979 - accuracy: 0.9121 Epoch 133/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1665 - accuracy: 0.9375 Epoch 134/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1575 - accuracy: 0.9336 Epoch 135/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1506 - accuracy: 0.9355 Epoch 136/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1519 - accuracy: 0.9297 Epoch 137/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1453 - accuracy: 0.9395 Epoch 138/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1427 - accuracy: 0.9453 Epoch 139/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1397 - accuracy: 0.9453 Epoch 140/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1529 - accuracy: 0.9355 Epoch 141/400 6/6 [==============================] - 0s 13ms/step - loss: 0.1498 - accuracy: 0.9434 Epoch 142/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1399 - accuracy: 0.9453 Epoch 143/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1462 - accuracy: 0.9434 Epoch 144/400 6/6 [==============================] - 0s 13ms/step - loss: 0.1556 - accuracy: 0.9492 Epoch 145/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1406 - accuracy: 0.9414 Epoch 146/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1487 - accuracy: 0.9473 Epoch 147/400 6/6 [==============================] - 0s 9ms/step - loss: 0.2227 - accuracy: 0.9023 Epoch 148/400 6/6 [==============================] - 0s 12ms/step - loss: 0.1741 - accuracy: 0.9316 Epoch 149/400 6/6 [==============================] - 0s 13ms/step - loss: 0.1484 - accuracy: 0.9375 Epoch 150/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1535 - accuracy: 0.9414 Epoch 151/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1502 - accuracy: 0.9355 Epoch 152/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1691 - accuracy: 0.9297 Epoch 153/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1441 - accuracy: 0.9414 Epoch 154/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1539 - accuracy: 0.9395 Epoch 155/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1500 - accuracy: 0.9395 Epoch 156/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1653 - accuracy: 0.9316 Epoch 157/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1367 - accuracy: 0.9434 Epoch 158/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1468 - accuracy: 0.9512 Epoch 159/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1290 - accuracy: 0.9512 Epoch 160/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1250 - accuracy: 0.9473 Epoch 161/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1254 - accuracy: 0.9531 Epoch 162/400 6/6 [==============================] - 0s 15ms/step - loss: 0.1473 - accuracy: 0.9375 Epoch 163/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1628 - accuracy: 0.9414 Epoch 164/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1510 - accuracy: 0.9316 Epoch 165/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1522 - accuracy: 0.9414 Epoch 166/400 6/6 [==============================] - 0s 15ms/step - loss: 0.1386 - accuracy: 0.9473 Epoch 167/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1424 - accuracy: 0.9434 Epoch 168/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1273 - accuracy: 0.9473 Epoch 169/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1519 - accuracy: 0.9434 Epoch 170/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1591 - accuracy: 0.9414 Epoch 171/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1688 - accuracy: 0.9180 Epoch 172/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1571 - accuracy: 0.9355 Epoch 173/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1664 - accuracy: 0.9258 Epoch 174/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1457 - accuracy: 0.9355 Epoch 175/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1523 - accuracy: 0.9395 Epoch 176/400 6/6 [==============================] - 0s 6ms/step - loss: 0.2618 - accuracy: 0.8828 Epoch 177/400 6/6 [==============================] - 0s 4ms/step - loss: 0.2113 - accuracy: 0.9102 Epoch 178/400 6/6 [==============================] - 0s 6ms/step - loss: 0.2085 - accuracy: 0.9180 Epoch 179/400 6/6 [==============================] - 0s 4ms/step - loss: 0.1616 - accuracy: 0.9355 Epoch 180/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1747 - accuracy: 0.9375 Epoch 181/400 6/6 [==============================] - 0s 16ms/step - loss: 0.1464 - accuracy: 0.9395 Epoch 182/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1693 - accuracy: 0.9258 Epoch 183/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1369 - accuracy: 0.9453 Epoch 184/400 6/6 [==============================] - 0s 35ms/step - loss: 0.1485 - accuracy: 0.9453 Epoch 185/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1855 - accuracy: 0.9199 Epoch 186/400 6/6 [==============================] - 0s 30ms/step - loss: 0.2046 - accuracy: 0.9219 Epoch 187/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1909 - accuracy: 0.9102 Epoch 188/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1991 - accuracy: 0.9258 Epoch 189/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1724 - accuracy: 0.9199 Epoch 190/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1883 - accuracy: 0.9277 Epoch 191/400 6/6 [==============================] - 0s 15ms/step - loss: 0.1532 - accuracy: 0.9277 Epoch 192/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1668 - accuracy: 0.9336 Epoch 193/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1505 - accuracy: 0.9297 Epoch 194/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1516 - accuracy: 0.9375 Epoch 195/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1639 - accuracy: 0.9258 Epoch 196/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1699 - accuracy: 0.9316 Epoch 197/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1532 - accuracy: 0.9355 Epoch 198/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1480 - accuracy: 0.9297 Epoch 199/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1311 - accuracy: 0.9434 Epoch 200/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1529 - accuracy: 0.9395 Epoch 201/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2210 - accuracy: 0.9004 Epoch 202/400 6/6 [==============================] - 0s 6ms/step - loss: 0.2113 - accuracy: 0.9043 Epoch 203/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1687 - accuracy: 0.9238 Epoch 204/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1516 - accuracy: 0.9395 Epoch 205/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1642 - accuracy: 0.9355 Epoch 206/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1496 - accuracy: 0.9453 Epoch 207/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1496 - accuracy: 0.9336 Epoch 208/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1515 - accuracy: 0.9453 Epoch 209/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1639 - accuracy: 0.9414 Epoch 210/400 6/6 [==============================] - 0s 4ms/step - loss: 0.1620 - accuracy: 0.9258 Epoch 211/400 6/6 [==============================] - 0s 4ms/step - loss: 0.1401 - accuracy: 0.9492 Epoch 212/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1512 - accuracy: 0.9180 Epoch 213/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1410 - accuracy: 0.9355 Epoch 214/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1537 - accuracy: 0.9531 Epoch 215/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1386 - accuracy: 0.9414 Epoch 216/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1523 - accuracy: 0.9395 Epoch 217/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1484 - accuracy: 0.9395 Epoch 218/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1550 - accuracy: 0.9258 Epoch 219/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1514 - accuracy: 0.9355 Epoch 220/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1268 - accuracy: 0.9414 Epoch 221/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1349 - accuracy: 0.9512 Epoch 222/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1363 - accuracy: 0.9473 Epoch 223/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1416 - accuracy: 0.9375 Epoch 224/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1385 - accuracy: 0.9473 Epoch 225/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1392 - accuracy: 0.9355 Epoch 226/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1273 - accuracy: 0.9453 Epoch 227/400 6/6 [==============================] - 0s 17ms/step - loss: 0.1302 - accuracy: 0.9492 Epoch 228/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1225 - accuracy: 0.9453 Epoch 229/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1177 - accuracy: 0.9473 Epoch 230/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1327 - accuracy: 0.9473 Epoch 231/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1364 - accuracy: 0.9434 Epoch 232/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1313 - accuracy: 0.9453 Epoch 233/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1466 - accuracy: 0.9414 Epoch 234/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1641 - accuracy: 0.9473 Epoch 235/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1288 - accuracy: 0.9492 Epoch 236/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1463 - accuracy: 0.9297 Epoch 237/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1344 - accuracy: 0.9492 Epoch 238/400 6/6 [==============================] - 0s 26ms/step - loss: 0.1835 - accuracy: 0.9180 Epoch 239/400 6/6 [==============================] - 0s 26ms/step - loss: 0.1715 - accuracy: 0.9258 Epoch 240/400 6/6 [==============================] - 0s 13ms/step - loss: 0.1342 - accuracy: 0.9434 Epoch 241/400 6/6 [==============================] - 0s 19ms/step - loss: 0.1363 - accuracy: 0.9434 Epoch 242/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1340 - accuracy: 0.9434 Epoch 243/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1765 - accuracy: 0.9121 Epoch 244/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1863 - accuracy: 0.9316 Epoch 245/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1818 - accuracy: 0.9238 Epoch 246/400 6/6 [==============================] - 0s 20ms/step - loss: 0.1545 - accuracy: 0.9336 Epoch 247/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1431 - accuracy: 0.9355 Epoch 248/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1168 - accuracy: 0.9531 Epoch 249/400 6/6 [==============================] - 0s 4ms/step - loss: 0.1290 - accuracy: 0.9492 Epoch 250/400 6/6 [==============================] - 0s 10ms/step - loss: 0.1529 - accuracy: 0.9375 Epoch 251/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1516 - accuracy: 0.9336 Epoch 252/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1465 - accuracy: 0.9434 Epoch 253/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1411 - accuracy: 0.9219 Epoch 254/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1503 - accuracy: 0.9395 Epoch 255/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1360 - accuracy: 0.9414 Epoch 256/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1277 - accuracy: 0.9473 Epoch 257/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1350 - accuracy: 0.9414 Epoch 258/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1324 - accuracy: 0.9395 Epoch 259/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1171 - accuracy: 0.9434 Epoch 260/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1336 - accuracy: 0.9512 Epoch 261/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1391 - accuracy: 0.9434 Epoch 262/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1280 - accuracy: 0.9512 Epoch 263/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1286 - accuracy: 0.9473 Epoch 264/400 6/6 [==============================] - 0s 33ms/step - loss: 0.1361 - accuracy: 0.9395 Epoch 265/400 6/6 [==============================] - 0s 19ms/step - loss: 0.1387 - accuracy: 0.9355 Epoch 266/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1136 - accuracy: 0.9551 Epoch 267/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1402 - accuracy: 0.9473 Epoch 268/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1606 - accuracy: 0.9355 Epoch 269/400 6/6 [==============================] - 0s 10ms/step - loss: 0.1622 - accuracy: 0.9336 Epoch 270/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1674 - accuracy: 0.9258 Epoch 271/400 6/6 [==============================] - 0s 14ms/step - loss: 0.1246 - accuracy: 0.9473 Epoch 272/400 6/6 [==============================] - 0s 11ms/step - loss: 0.1276 - accuracy: 0.9453 Epoch 273/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1668 - accuracy: 0.9316 Epoch 274/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1782 - accuracy: 0.9355 Epoch 275/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1671 - accuracy: 0.9297 Epoch 276/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1497 - accuracy: 0.9473 Epoch 277/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1261 - accuracy: 0.9453 Epoch 278/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1240 - accuracy: 0.9570 Epoch 279/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1632 - accuracy: 0.9238 Epoch 280/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1767 - accuracy: 0.9336 Epoch 281/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1284 - accuracy: 0.9512 Epoch 282/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1311 - accuracy: 0.9453 Epoch 283/400 6/6 [==============================] - 0s 16ms/step - loss: 0.1390 - accuracy: 0.9453 Epoch 284/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1259 - accuracy: 0.9512 Epoch 285/400 6/6 [==============================] - 0s 11ms/step - loss: 0.1369 - accuracy: 0.9434 Epoch 286/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1514 - accuracy: 0.9453 Epoch 287/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1318 - accuracy: 0.9512 Epoch 288/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1623 - accuracy: 0.9473 Epoch 289/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1259 - accuracy: 0.9512 Epoch 290/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1321 - accuracy: 0.9434 Epoch 291/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1207 - accuracy: 0.9512 Epoch 292/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1231 - accuracy: 0.9473 Epoch 293/400 6/6 [==============================] - 0s 15ms/step - loss: 0.1259 - accuracy: 0.9395 Epoch 294/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1216 - accuracy: 0.9531 Epoch 295/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1232 - accuracy: 0.9492 Epoch 296/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1416 - accuracy: 0.9453 Epoch 297/400 6/6 [==============================] - 0s 4ms/step - loss: 0.1175 - accuracy: 0.9492 Epoch 298/400 6/6 [==============================] - 0s 5ms/step - loss: 0.2018 - accuracy: 0.9004 Epoch 299/400 6/6 [==============================] - 0s 16ms/step - loss: 0.1384 - accuracy: 0.9453 Epoch 300/400 6/6 [==============================] - 0s 25ms/step - loss: 0.1251 - accuracy: 0.9434 Epoch 301/400 6/6 [==============================] - 0s 13ms/step - loss: 0.1087 - accuracy: 0.9590 Epoch 302/400 6/6 [==============================] - 0s 12ms/step - loss: 0.1231 - accuracy: 0.9531 Epoch 303/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1243 - accuracy: 0.9512 Epoch 304/400 6/6 [==============================] - 0s 15ms/step - loss: 0.1236 - accuracy: 0.9453 Epoch 305/400 6/6 [==============================] - 0s 19ms/step - loss: 0.1195 - accuracy: 0.9531 Epoch 306/400 6/6 [==============================] - 0s 14ms/step - loss: 0.1163 - accuracy: 0.9492 Epoch 307/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1254 - accuracy: 0.9492 Epoch 308/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1316 - accuracy: 0.9453 Epoch 309/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1292 - accuracy: 0.9492 Epoch 310/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1310 - accuracy: 0.9492 Epoch 311/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1753 - accuracy: 0.9238 Epoch 312/400 6/6 [==============================] - 0s 6ms/step - loss: 0.2028 - accuracy: 0.9160 Epoch 313/400 6/6 [==============================] - 0s 11ms/step - loss: 0.1548 - accuracy: 0.9551 Epoch 314/400 6/6 [==============================] - 0s 4ms/step - loss: 0.1372 - accuracy: 0.9434 Epoch 315/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1551 - accuracy: 0.9395 Epoch 316/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1213 - accuracy: 0.9453 Epoch 317/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1510 - accuracy: 0.9297 Epoch 318/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1184 - accuracy: 0.9551 Epoch 319/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1379 - accuracy: 0.9336 Epoch 320/400 6/6 [==============================] - 0s 18ms/step - loss: 0.1170 - accuracy: 0.9512 Epoch 321/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1228 - accuracy: 0.9551 Epoch 322/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1153 - accuracy: 0.9531 Epoch 323/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1194 - accuracy: 0.9531 Epoch 324/400 6/6 [==============================] - 0s 10ms/step - loss: 0.1080 - accuracy: 0.9531 Epoch 325/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1165 - accuracy: 0.9512 Epoch 326/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1061 - accuracy: 0.9609 Epoch 327/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1083 - accuracy: 0.9492 Epoch 328/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1109 - accuracy: 0.9531 Epoch 329/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1222 - accuracy: 0.9512 Epoch 330/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1102 - accuracy: 0.9512 Epoch 331/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1040 - accuracy: 0.9512 Epoch 332/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1465 - accuracy: 0.9492 Epoch 333/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1044 - accuracy: 0.9512 Epoch 334/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1163 - accuracy: 0.9453 Epoch 335/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1064 - accuracy: 0.9609 Epoch 336/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1128 - accuracy: 0.9492 Epoch 337/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1348 - accuracy: 0.9453 Epoch 338/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1596 - accuracy: 0.9336 Epoch 339/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1109 - accuracy: 0.9512 Epoch 340/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1071 - accuracy: 0.9570 Epoch 341/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1111 - accuracy: 0.9531 Epoch 342/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1044 - accuracy: 0.9629 Epoch 343/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1598 - accuracy: 0.9297 Epoch 344/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1223 - accuracy: 0.9551 Epoch 345/400 6/6 [==============================] - 0s 33ms/step - loss: 0.1076 - accuracy: 0.9531 Epoch 346/400 6/6 [==============================] - 0s 13ms/step - loss: 0.1086 - accuracy: 0.9473 Epoch 347/400 6/6 [==============================] - 0s 34ms/step - loss: 0.0990 - accuracy: 0.9512 Epoch 348/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1296 - accuracy: 0.9531 Epoch 349/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1188 - accuracy: 0.9492 Epoch 350/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1555 - accuracy: 0.9316 Epoch 351/400 6/6 [==============================] - 0s 16ms/step - loss: 0.1444 - accuracy: 0.9453 Epoch 352/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1172 - accuracy: 0.9609 Epoch 353/400 6/6 [==============================] - 0s 13ms/step - loss: 0.1332 - accuracy: 0.9414 Epoch 354/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1202 - accuracy: 0.9453 Epoch 355/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1162 - accuracy: 0.9434 Epoch 356/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1364 - accuracy: 0.9492 Epoch 357/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1224 - accuracy: 0.9570 Epoch 358/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1161 - accuracy: 0.9512 Epoch 359/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1105 - accuracy: 0.9551 Epoch 360/400 6/6 [==============================] - 0s 6ms/step - loss: 0.0989 - accuracy: 0.9551 Epoch 361/400 6/6 [==============================] - 0s 8ms/step - loss: 0.0973 - accuracy: 0.9551 Epoch 362/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1177 - accuracy: 0.9531 Epoch 363/400 6/6 [==============================] - 0s 4ms/step - loss: 0.1118 - accuracy: 0.9570 Epoch 364/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1138 - accuracy: 0.9590 Epoch 365/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1300 - accuracy: 0.9414 Epoch 366/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1551 - accuracy: 0.9355 Epoch 367/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1344 - accuracy: 0.9453 Epoch 368/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1190 - accuracy: 0.9512 Epoch 369/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1215 - accuracy: 0.9453 Epoch 370/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1049 - accuracy: 0.9512 Epoch 371/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1142 - accuracy: 0.9551 Epoch 372/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1141 - accuracy: 0.9590 Epoch 373/400 6/6 [==============================] - 0s 8ms/step - loss: 0.1166 - accuracy: 0.9453 Epoch 374/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1131 - accuracy: 0.9492 Epoch 375/400 6/6 [==============================] - 0s 19ms/step - loss: 0.1102 - accuracy: 0.9551 Epoch 376/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1099 - accuracy: 0.9590 Epoch 377/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1218 - accuracy: 0.9492 Epoch 378/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1358 - accuracy: 0.9395 Epoch 379/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1222 - accuracy: 0.9512 Epoch 380/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1159 - accuracy: 0.9492 Epoch 381/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1227 - accuracy: 0.9492 Epoch 382/400 6/6 [==============================] - 0s 19ms/step - loss: 0.1112 - accuracy: 0.9453 Epoch 383/400 6/6 [==============================] - 0s 32ms/step - loss: 0.1159 - accuracy: 0.9512 Epoch 384/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1125 - accuracy: 0.9473 Epoch 385/400 6/6 [==============================] - 0s 10ms/step - loss: 0.1206 - accuracy: 0.9492 Epoch 386/400 6/6 [==============================] - 0s 10ms/step - loss: 0.1223 - accuracy: 0.9512 Epoch 387/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1200 - accuracy: 0.9512 Epoch 388/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1011 - accuracy: 0.9629 Epoch 389/400 6/6 [==============================] - 0s 7ms/step - loss: 0.0949 - accuracy: 0.9531 Epoch 390/400 6/6 [==============================] - 0s 6ms/step - loss: 0.0934 - accuracy: 0.9570 Epoch 391/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1146 - accuracy: 0.9668 Epoch 392/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1126 - accuracy: 0.9551 Epoch 393/400 6/6 [==============================] - 0s 4ms/step - loss: 0.1005 - accuracy: 0.9531 Epoch 394/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1107 - accuracy: 0.9512 Epoch 395/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1154 - accuracy: 0.9492 Epoch 396/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1113 - accuracy: 0.9531 Epoch 397/400 6/6 [==============================] - 0s 5ms/step - loss: 0.1192 - accuracy: 0.9492 Epoch 398/400 6/6 [==============================] - 0s 9ms/step - loss: 0.1087 - accuracy: 0.9551 Epoch 399/400 6/6 [==============================] - 0s 7ms/step - loss: 0.1010 - accuracy: 0.9590 Epoch 400/400 6/6 [==============================] - 0s 6ms/step - loss: 0.1066 - accuracy: 0.9590
print("Execution time: ",(end_n-start_n), "s")
Execution time: 28.512630701065063 s
# Obtaining test set accuracy score
cm = 0
y_pred = model_deep.predict(X_test)
y_pred = (y_pred > 0.50)
cm = confusion_matrix(y_test, y_pred)
print("Accuracy: {}%".format(((cm[0][0] + cm[1][1])/len(y_test))*100))
2/2 [==============================] - 0s 4ms/step Accuracy: 96.49122807017544%
# Plotting confidence matrix
cat = ['Benign - 0', 'Malignant - 1']
sns.heatmap(cm, annot = True, xticklabels= cat, yticklabels = cat, cmap = 'Blues')
<AxesSubplot: >
As we see both methods can yield similar results. In the particular case ANN architecture gave 1 missclassification case more than Supporter Vector Machine model. Execution time of coarse search through multiple models plus fine grid-search of the best model took 137 seconds. On the same machine ANN fitting took 29 seconds. However preparing and testing multiple architectures of neural network to find one working properly on this particular dataset took significant amount of time, while searching and fitting through standard models was just running simple search functions. It is necessary to create similar methods for looping through multiple neural network architecture to compare both methods in terms of exectution time. It might be more beneficial to use simpler models first on small datasets like this as neural networks tend to work better with large training input sizes in general.